package math.geom3d;

import math.base.Point3d;
import math.base.Vector3d;
import math.geomUtils.SurfaceType;

/**
 * @author Saga
 *
 */
public abstract class Surface3d {

    public abstract SurfaceType getSurfaceType();

    public abstract void uReverse();

    public abstract Surface3d uReversed();

    public abstract void vReverse();

    public abstract Surface3d vReversed();

    public abstract boolean isUPeriodic();

    public abstract double getUPeriod();

    public abstract boolean isVPeriodic();

    public abstract double getVPeriod();

    public abstract double getUFirstParameter();

    public abstract double getULastParameter();

    public abstract double getVFirstParameter();

    public abstract double getVLastParameter();

    public abstract Point3d calcValue(double _uParam, double _vParam);

    public abstract Vector3d calcDerivativeU(double _uParam, double _vParam);

    public abstract Vector3d calcDerivativeV(double _uParam, double _vParam);

    public abstract void calcDerivative(double _uParam, double _vParam, Vector3d _derU,
            Vector3d _derV);

    public abstract Vector3d calcDerivativeN(double _uParam, double _vParam, int _uOrder,
            int _vOrder);

    public abstract void calcValueAndDerivative1(double _uParam, double _vParam, Point3d _pt,
            Vector3d _derU, Vector3d _derV);

    public abstract void calcValueAndDerivative2(double _uParam, double _vParam, Point3d _pt,
            Vector3d _der1U, Vector3d _der1V, Vector3d _der2U, Vector3d _der2V, Vector3d _der2UV);

    public abstract void calcValueAndDerivative3(double _uParam, double _vParam, Point3d _pt,
            Vector3d _der1U, Vector3d _der1V, Vector3d _der2U, Vector3d _der2V, Vector3d _der2UV,
            Vector3d _der3U, Vector3d _der3V, Vector3d _der3UUV, Vector3d _der3UVV);

    public abstract Curve3d calcUISOCurve(double _param);

    public abstract Curve3d calcVISOCurve(double _param);
}
